#ifndef PERMISSION_MANAGER_H
#define PERMISSION_MANAGER_H

#include <QObject>
#include <QString>
#include <QMap>
#include <QSet>

namespace CollaborativeDesign {

// 权限类型枚举
enum class PermissionType {
    Read,           // 读取权限
    Write,          // 写入权限
    Delete,         // 删除权限
    Admin           // 管理权限
};

// 角色类型枚举
enum class RoleType {
    Guest,          // 访客
    Viewer,         // 查看者
    Editor,         // 编辑者
    Manager,        // 管理者
    Owner           // 所有者
};

// 权限管理器类
class PermissionManager : public QObject
{
    Q_OBJECT

public:
    PermissionManager();
    ~PermissionManager();

    // 初始化权限管理器
    bool initialize();
    
    // 检查用户是否有指定权限
    bool hasPermission(const QString& userId, const QString& resourceId, PermissionType permission);
    
    // 授予用户权限
    bool grantPermission(const QString& userId, const QString& resourceId, PermissionType permission);
    
    // 撤销用户权限
    bool revokePermission(const QString& userId, const QString& resourceId, PermissionType permission);
    
    // 设置用户角色
    bool setUserRole(const QString& userId, const QString& resourceId, RoleType role);
    
    // 获取用户角色
    RoleType getUserRole(const QString& userId, const QString& resourceId);
    
    // 获取资源的所有权限用户
    QMap<QString, QSet<PermissionType>> getResourcePermissions(const QString& resourceId);
    
    // 获取用户的所有权限资源
    QMap<QString, QSet<PermissionType>> getUserPermissions(const QString& userId);
    
    // 创建资源权限
    bool createResourcePermission(const QString& resourceId, const QString& ownerId);
    
    // 删除资源权限
    bool deleteResourcePermission(const QString& resourceId);

signals:
    // 权限变更信号
    void permissionChanged(const QString& userId, const QString& resourceId, PermissionType permission, bool granted);
    
    // 角色变更信号
    void roleChanged(const QString& userId, const QString& resourceId, RoleType role);

private:
    // 角色到权限的映射
    QSet<PermissionType> getRolePermissions(RoleType role);
    
    // 加载权限配置
    bool loadPermissionConfig();
    
    // 保存权限配置
    bool savePermissionConfig();
    
    // 验证操作权限
    bool validateOperation(const QString& operatorId, const QString& resourceId, PermissionType requiredPermission);

private:
    // 用户-资源-权限映射
    QMap<QString, QMap<QString, QSet<PermissionType>>> m_userResourcePermissions;
    
    // 用户-资源-角色映射
    QMap<QString, QMap<QString, RoleType>> m_userResourceRoles;
    
    // 资源-所有者映射
    QMap<QString, QString> m_resourceOwners;
    
    // 配置文件路径
    QString m_configFilePath;
};

} // namespace CollaborativeDesign

#endif // PERMISSION_MANAGER_H 